package main

import (
	"context"
	"fmt"
	"github.com/go-redis/redis/v8"
	"time"
)

var ctx = context.Background()

//redis框架方法集合
func main() {
	rdb := redis.NewClient(&redis.Options{
		Addr:     "81.68.186.20:6379",
		Password: "ffdd2021@",
		DB:       0,
	})
	if rdb == nil {
		fmt.Println("redis连接成功")
		defer rdb.Close()
	}
	err := rdb.Set(ctx, "age", 2, time.Hour).Err()
	if err != nil {
		fmt.Println(err)
	}
	/*
		Incr():增加+1
		Incr()、IncrBy()都是操作数字，对数字进行增加的操作，incr是执行原子加1操作，incrBy是增加指定的数

		所谓原子操作是指不会被线程调度机制打断的操作：这种操作一旦开始，就一直运行到结束，中间不会有任何context witch(切换到另一个线程).

		(1)在单线程中，能够在单条指令中完成的操作都可以认为是“原子操作”，因为中断只能发生于指令之间。

		(2)在多线程中，不能被其它进程(线程)打算的操作叫原子操作。

		Redis单命令的原子性主要得益于Redis的单线程
	*/
	i, err2 := rdb.Incr(ctx, "age").Result()
	if err2 != nil {
		fmt.Println(err)
	}
	fmt.Println("当前key值为", i)

	//IncrBy():按指定步长增加
	i2, err3 := rdb.IncrBy(ctx, "age", 2).Result()
	if err3 != nil {
		fmt.Println(err3)
	}
	fmt.Println("当前key值", i2)

	//Decr():减少-1
	i3, err4 := rdb.Decr(ctx, "age").Result()
	if err4 != nil {
		fmt.Println(err4)
	}
	fmt.Println("当前key值", i3)

	//DecrBy():按指定步长减少

	fmt.Println("-----------------------------------------------")
	/*
		Append():追加
		Append()表示往字符串后面追加元素，返回值是字符串的总长度
	*/
	i4, err5 := rdb.Append(ctx, "ding", "岁").Result()
	if err5 != nil {
		fmt.Println(err5)

	}
	fmt.Println("当前key值", i4)

	//StrLen():获取长度
	i5, err6 := rdb.StrLen(ctx, "ding").Result()
	if err6 != nil {
		fmt.Println(err6)
	}
	fmt.Println("当前key值长度", i5)

	//该框架的方法更原生操作redis十分相似 其他操作参考https://pkg.go.dev/github.com/go-redis/redis/v8 也可参考redis中文官网查看

}
